package ucuserslogic

import (
	"context"
	"github.com/zeromicro/go-zero/core/logx"
	"navi-mumbai/app/rpc/model/pg/usercenter"
	"navi-mumbai/app/rpc/usercenter/internal/svc"
	"navi-mumbai/app/rpc/usercenter/pb"
	"navi-mumbai/common/utils"
	"navi-mumbai/common/xerr"
)

type ReportUserInviteDeviceLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewReportUserInviteDeviceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ReportUserInviteDeviceLogic {
	return &ReportUserInviteDeviceLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

func (l *ReportUserInviteDeviceLogic) ReportUserInviteDevice(in *pb.ReportUserInviteDeviceReq) (*pb.ReportUserInviteDeviceResp, error) {
	defer utils.RecoverPanic()

	if in.Pid == 0 || in.DeviceId == "" {
		return nil, xerr.NewGrpcErrCodeMsg(xerr.RequestParamError, "pid or deviceId is nil")
	}
	// 查询是否存在,如果不存在,则保存数据, 若存在,则更新数据
	userInviteDevice, err := l.svcCtx.UserInviteDeviceModel.FindUserInviteDeviceByDeviceId(l.ctx, in.DeviceId)
	if err != nil {
		l.Logger.Errorf("ReportUserInviteDevice FindOneByDeviceId error. userInviteDevice: %+v", userInviteDevice)
		return nil, err
	}
	if userInviteDevice == nil {
		// 保存新数据
		ud := &usercenter.UserInviteDevice{
			Pid:      in.Pid,
			DeviceId: in.DeviceId,
		}
		_, err = l.svcCtx.UserInviteDeviceModel.Insert(l.ctx, ud)
		if err != nil {
			l.Logger.Errorf("ReportUserInviteDevice Insert error. userInviteDevice: %+v", userInviteDevice)
			return nil, err
		}
	} else {
		// 判断是否已注册，如果已注册，则不在更新上级
		list, err := l.svcCtx.UserAccountModel.Find(l.ctx, in.DeviceId, nil, nil, 0, 0)
		if err != nil {
			l.Logger.Errorf("ReportUserInviteDevice UserAccountModel.Find error. DeviceId: %+v", in.DeviceId)
			return nil, err
		}
		// 如果已注册，则不需要更改上级
		if list != nil && len(list) > 0 {
			return &pb.ReportUserInviteDeviceResp{}, nil
		}
		userInviteDevice.Pid = in.Pid
		err = l.svcCtx.UserInviteDeviceModel.Update(l.ctx, userInviteDevice)
		if err != nil {
			l.Logger.Errorf("ReportUserInviteDevice Insert error. Update: %+v", userInviteDevice)
			return nil, err
		}
	}
	return &pb.ReportUserInviteDeviceResp{}, nil
}
